/**
GPIO 使用system clock
*/

#include "../MKL25Z4.h"

void sys_clock_init(void) {
  // 使用外部8M时钟源
  SIM_SCGC5 |= (uint32_t)0x0200UL; // 开启时钟门
  SIM_CLKDIV1 = (uint32_t)0x10010000UL; // 内核/系统2分频；Flash和总线2分频
  PORTA_PCR18 &= (uint32_t)~0x01000700UL;
  PORTA_PCR19 &= (uint32_t)~0x01000700UL;
  // Switch to FBE Mode
  OSC0_CR = (uint8_t)0x89U; // 外部参考使能；
  MCG_C2 = (uint8_t)0x24U; // 选择使用外部参考源；板上8Mhz有源晶振
  MCG_C1 = (uint8_t)0x9AU; // FLL外部参考,256分频
  MCG_C4 &= (uint8_t) ~(uint8_t)0xE0U;
  MCG_C5 =
      MCG_C5_PRDIV0(1); // 括号的数值0~24均可，实际为晶振/()+1，本例8/(0+1)=4MHz
  MCG_C6 = MCG_C6_VDIV0(0); //()为倍率，0~31；本例为0：4M*(24+0)=96MHz

  while ((MCG_S & MCG_S_IREFST_MASK) != 0x00U)
    ;
  while ((MCG_S & 0x0CU) != 0x08U)
    ;
  // 现在已经进入了 FBE模式
  MCG_C6 |= (uint8_t)0x40U;
  while ((MCG_S & 0x0CU) != 0x08U)
    ;
  while ((MCG_S & MCG_S_LOCK0_MASK) == 0x00U)
    ;
  MCG_C1 = (uint8_t)0x1AU;
  while ((MCG_S & 0x0CU) != 0x0CU)
    ;
}